package keter.activemq;

import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import keter.util.ExecutorUtil;
import org.apache.activemq.ActiveMQConnection;
import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;

public class Sender {

    private static final int SEND_NUMBER = 2000;

    static ListeningExecutorService service = MoreExecutors.listeningDecorator(
            ExecutorUtil.getExecutorService("DEMO_WORKER_THREAD-%d",10,false));

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            service.submit(() -> {
                sending();
                System.out.println("THREAD:" + Thread.currentThread().getId()+"DONE!");
            });
        }
    }

    private static void sending() {
//            System.out.println("SENDING MESSAGE...");
            // 构造消息，此处写死，项目就是参数，或者方法获取
            // ConnectionFactory ：连接工厂，JMS 用它创建连接
            ConnectionFactory connectionFactory;
            // Connection ：JMS 客户端到JMS Provider 的连接
            Connection connection = null;
            // Session： 一个发送或接收消息的线程
            Session session;
            // Destination ：消息的目的地;消息发送给谁.
            Destination destination;
            // MessageProducer：消息发送者
            MessageProducer producer;
            // TextMessage message;
            // 构造ConnectionFactory实例对象，此处采用ActiveMq的实现jar
            connectionFactory = new ActiveMQConnectionFactory(
                    ActiveMQConnection.DEFAULT_USER,
                    ActiveMQConnection.DEFAULT_PASSWORD,
                    "tcp://192.168.241.100:61616");
            try {
                // 构造从工厂得到连接对象
                connection = connectionFactory.createConnection();
                // 启动
                connection.start();
                // 获取操作连接
                session = connection.createSession(Boolean.TRUE,
                        Session.AUTO_ACKNOWLEDGE);
                // 获取session注意参数值xingbo.xu-queue是一个服务器的queue，须在在ActiveMq的console配置
                destination = session.createQueue("SecondQueue");
                // 得到消息生成者【发送者】
                producer = session.createProducer(destination);
                // 设置不持久化，此处学习，实际根据项目决定
                producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
                sendMessage(session, producer);
                session.commit();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (null != connection){
                        connection.close();
                    }
                } catch (Throwable ignore) {
                    ignore.printStackTrace();
                }
            }
    }

    public static void sendMessage(Session session, MessageProducer producer) throws JMSException {
        for (int i = 1; i <= SEND_NUMBER; i++) {
        TextMessage message = null;
        try {
            message = session.createTextMessage("ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息ActiveMq 发送的消息" + i);
        } catch (JMSException e) {
            e.printStackTrace();
        }
        // 发送消息到目的地方
//            System.out.println("发送消息：" + "ActiveMq 发送的消息" + i);
            producer.send(message);
        }
    }
}